package 设计模式.创建型.单例模式.实现线程内的单例模式;


import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 通过一个 HashMap 来存储对象，其中 key 是线程 ID，value 是对象。
 * 在生成实例的时候，首先获取到线程id，然后放到 Map 中，在从 Map 中取出。如果已经存在的话，就放不进去了。
 *
 * 通过 ThreadLocal 也可以实现线程级别内的单例模式
 */
public class IdGenerator {
    private AtomicLong id = new AtomicLong(0);

    private static final ConcurrentHashMap<Long, IdGenerator> instances = new ConcurrentHashMap<>();

    private IdGenerator() {}

    public static IdGenerator getInstance() {
        Long currentThreadId = Thread.currentThread().getId();
        instances.putIfAbsent(currentThreadId, new IdGenerator());
        return instances.get(currentThreadId);
    }

    public static void main(String[] args) {
        IdGenerator instance = IdGenerator.getInstance();
    }
}